package com.hu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

import static com.hu.Stream01.getAuthors;
import static com.hu.Stream01.getAuthors2;

/**
 * @author 00355760
 * @功能：
 * @版本： V1
 * @版权： 信息技术有限公司（http://www.mychery.com/）
 * @作者： 磐石战队开发组  00355760
 * @日期： 2024/9/14 17:05
 */
public class Optional01 {

    public static void main(String[] args) throws Throwable {
        List<Author> authors = getAuthors();
        //ofNullable内部有个判断，如果为空，则返回Optional.empty()，否则返回Optional.of(authors)
        Optional<List<Author>> authors1 = Optional.ofNullable(authors);
        authors1.ifPresent(authors2 -> System.out.println(authors2.getClass()));

        /**
         * 操作
         */
        Author author = getAuthors2();
        Optional<Author> optional = Optional.ofNullable(author);
        //安全的消费 ifPresent
        optional.ifPresent(System.out::println);
        //安全的获取 orElse\orElseGet\orElseThrow
        System.out.println(authors1.orElseGet(ArrayList::new));
        System.out.println(authors1.orElseThrow(() -> new Throwable("没有数据")));
        // 过滤 filter
        System.out.println(optional.filter(a -> a.getAge() > 18));
        //判断 isPresent
        System.out.println(optional.isPresent());
        //数据转换 map
        optional.map(Author::getAge).ifPresent(System.out::println);

        /**
         * 方法引用
         * 引用静态方法(Person::staticMethod)
         * 方法体中只有一行代码，调用某个类的静态方法，要重写的抽象方法中所有的参数都按照顺序传入到了这个静态方法中
         *
         * 引用特定对象的实例方法(person::method)
         * 方法体中只有一行代码，调用某个对象的成员方法，要重写的抽象方法中所有的参数都按照顺序传入到了这个成员方法中
         *
         * 引用特定类型的任意对象的实例方法(Person::method)
         * 方法体中只有一行代码，调用第一个参数的成员方法，要重写的抽象方法中剩余的所有的参数都按照顺序传入到了这个成员方法中
         *
         * 引用构造函数(Person::new)
         * 方法体中只有一行代码，调用某个类的构造方法，要重写的抽象方法中所有的参数都按照顺序传入到了这个构造方法中
         */
    }
}
